home *** CD-ROM | disk | FTP | other *** search
- /*
- * This file is part of ixemul.library for the Amiga.
- * Copyright (C) 1991, 1992 Markus M. Wild
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id: __close.c,v 1.2 1994/06/19 15:18:48 rluebbert Exp $
- *
- * $Log: __close.c,v $
- * Revision 1.2 1994/06/19 15:18:48 rluebbert
- * *** empty log message ***
- *
- */
-
- #define _KERNEL
- #include "ixemul.h"
- #include "kprintf.h"
-
- int
- __close(struct file *f)
- {
- if (f->f_count == 1)
- __wait_select_packet(&f->f_select_sp);
-
- ix_lock_base ();
-
- f->f_count--;
-
- KPRINTF (("__close: closing file $%lx, f_count now %ld.\n", f, f->f_count));
- if (f->f_count > 0) goto unlock;
-
- if (!(f->f_flags & FEXTOPEN))
- {
- __Close (CTOBPTR (f->f_fh));
- if (!memcmp(f->f_name, "/fifo/pty", 9))
- {
- int i = (f->f_name[9] - 'p') * 16 + f->f_name[10] - (f->f_name[10] >= 'a' ? 'a' - 10 : '0');
- char mask = (f->f_name[17] == 'm' ? IX_PTY_MASTER : IX_PTY_SLAVE);
-
- ix.ix_ptys[i] &= ~(mask & IX_PTY_OPEN);
- ix.ix_ptys[i] |= mask & IX_PTY_CLOSE;
- if (!(ix.ix_ptys[i] & IX_PTY_OPEN))
- ix.ix_ptys[i] = 0; /* both slave and master are closed, so free this pty */
- }
- }
-
- /* if we have to set some modes, do it now */
- if (f->f_stb_dirty)
- {
- syscall (SYS_chmod, f->f_name, f->f_stb.st_mode);
- /* should later also set modification time */
- }
-
- if (f->f_flags & FUNLINK) syscall (SYS_unlink, f->f_name);
-
- /* NOTE: the FEXTOPEN flag tells us two things: 1) we shouldn't
- * perform a Close() on the filehandle, and 2) the name in the
- * file structure wasn't allocated by malloc(), so we shouldn't
- * free() it either. */
- if (!(f->f_flags & FEXTOPEN) && f->f_name)
- {
- KPRINTF (("f->f_name(%s) ", f->f_name));
- kfree (f->f_name);
- }
-
- unlock:
- ix_unlock_base ();
-
- return 0;
- }
-